package com.example.extend.converter;

import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;

@Component
public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        System.out.println("这是date转换器的"+source);
        Date date=null;
        SimpleDateFormat sf=null;
        try {
            sf=getDateFormat(source);
            date = sf.parse(source);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return date;
    }

    //利用正则表达式控制日期的输入格式
    public SimpleDateFormat getDateFormat(String source) throws Exception {
        SimpleDateFormat sf = null;
        //其实没必要去校验它日期是否是按规定的，即月只能是1-12
        //其实可能不用理会这些的，因为即使我们输入2021-10-32，也可以解析成2021-11-1
        if(Pattern.matches("^\\d{4}-(0[0-9]|1[0-2])-([0-2][0-9]|3[0-1])\\s+([0-1][0-9]|2[0-4]):([0-5][0-9]):([0-5][0-9])$", source)) {
            sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        }
        else if(Pattern.matches("^\\d{4}/(0[0-9]|1[0-2])/([0-2][0-9]|3[0-1])\\s+([0-1][0-9]|2[0-4]):([0-5][0-9]):([0-5][0-9])$", source)) {
            sf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
        }
        else if (Pattern.matches("^\\d{4}-(0[0-9]|1[0-2])-([0-2][0-9]|3[0-1])$", source)) {
            sf = new SimpleDateFormat("yyyy-MM-dd");
        }
        else if (Pattern.matches("^\\d{4}/(0[0-9]|1[0-2])/([0-2][0-9]|3[0-1])$", source)) {
            sf = new SimpleDateFormat("yyyy/MM/dd");
        }
        else{
            throw new Exception("无法解析"+source+"，格式可能不是yyyy-MM-dd hh:mm:ss 或" +
                    "者 yyyy/MM/dd hh:mm:ss 或者 yyyy-MM-dd 或者 yyyy/MM/dd\n");
        }
        return sf;
    }
}
